# 简单来说函数就是一段实现特定功能的代码，使用函数可以提高代码的重复利用率。
# Python 中有很多内置函数，比如之前常用的 print 函数，当内置函数不足以满足
# 我们的需求时，我们还可以自定义函数。
# 1、Python 使用 def 关键字来声明函数，格式如下所示：
# def 函数名(参数):
#     函数体
#     return 返回值
# 有参数有返回值的函数
def add(a, b):
    return a + b


a = add(1, 2)
print(a)


# 有参数无返回值的函数
def sub(a, b):
    c = a - b
    print(c)


print(sub(3, 4))


# 无参数有返回值的函数
def mul():
    return 3 * 5


print(mul())


# 无参数无返回值的函数
def div():
    a = 3 / 5


div()


# 2、要定义一个无任何功能的空函数，函数体只写 pass 即可。格式如下所示：

# def 函数名():	pass
def empty():
    pass


# 3、当我们不确定参数的个数时，可以使用不定长参数，在参数名前加 * 进行声明，格式如下所示：
# def 函数名(*参数名):	函数体
def add(*args):
    result = 0
    for i in args:
        result += i
    return result


print(add(1, 2, 3, 4, 5))
# 4、我们还可以使用 lambda 定义匿名函数，格式如下所示：
# lambda 参数 : 表达式
a = lambda x, y: x + y
print(a(1, 2))

print("*" * 30)


def sum_2(a, b):  # a、b都为形式参数
    return a + b


result = sum_2(1, 2)  # 1,2都为实际参数


def power(x, n=2):  # 默认参数，缺省参数
    return x ** n


a = power(4, 3)
b = power(5, 3)
c = power(5)
print(c)
print(a)

a = int('16', 8)
print(a)


def infos(name, age=24, gender='男'):
    return '大家好，我是%s，今年%d岁，性别是%s' % (name, age, gender)


lily = infos('lily')
print(lily)
jack = infos('jack', age=44, gender='女')
print(jack)


# 可变参数
def sum(*args):
    print(args)
    total = 0
    result = 0
    for i in args:
        result += i
        total += 1
    return [result, total]


print(sum(1, 2, 3, 4, 5, 6, 7))


# 以下是错误示例：错误为SyntaxError
# student = {"id": 1, "age": 24, "gender": "男"}
# ss = sum(**student)
# print(ss)


def f(**args):  # 可变参数,接受字典
    for k, v in args.items():
        print(k, v)


student = {"id": 1, "age": 24, "gender": "男"}
# 注意如果调用的是字典函数，则需要用**，否则会报错：TypeError
ss = f(**student)
print(ss)
